package core;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sql.ConexaoException;
import sql.CursoBD;
import sql.ProfessorBD;
import sql.ProfessorException;
import sql.TurmaBD;
import sql.TurmaException;

/**
 * Servlet implementation class TurmaServlet
 */
public class TurmaServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public TurmaServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		determinaAcoes( request, response );
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}
	
	private void determinaAcoes( HttpServletRequest req, HttpServletResponse res ) {
		Enumeration nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "cadastrar") ) {
			cadastrarTurma( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "pesquisar") ) {
			pesquisarTurma( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "remover") ) {
			removerTurma( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "editar") ) {
			editarTurma( req, res );
		}
		nomesParam = req.getParameterNames();
		if( temParametro( nomesParam, "atualizar") ) {
			atualizarTurma( req, res );
		}
	}

	private boolean temParametro( Enumeration lstNomes, String nome ) {
		while( lstNomes.hasMoreElements() ) {
			String nomeDaLista = (String) lstNomes.nextElement();
			if( nomeDaLista.compareTo(nome) == 0 ) {
				return true;
			}
		}
		return false;
	}
	
	private boolean cadastrarTurma( HttpServletRequest req, HttpServletResponse res ) {
		TurmaBD bd = new TurmaBD();
		CursoBD bdCurso = new CursoBD();
		
		String nome = req.getParameter( "nome" );
		String curso = req.getParameter( "curso" );
		Turma novaTurma = new Turma( nome, bdCurso.getCursoPorCodigo(curso) );
		
		bdCurso.close();
		
		try {
			bd.addTurma( novaTurma );
			bd.close();
		} catch (TurmaException e) {
			mensagemErro(req, res, "Erro Cadastro", e.getMessage() );
			return false;
		} catch (ConexaoException e) {
			e.printStackTrace();
		}
		mensagemSucesso( req, res, "Sucesso Cadastro.", "Turma <b>" + nome + "</b> cadastrada com sucesso.");
		
		return true;
	}
	
	private boolean pesquisarTurma( HttpServletRequest req, HttpServletResponse res ) {
		TurmaBD bd = new TurmaBD();
		
		String nome = req.getParameter( "pesquisar" );
		try {
			
			ArrayList<Turma> lstTurmas = bd.getTurmas( nome );
			RequestDispatcher rd = req.getRequestDispatcher("pesquisa_turma.jsp");
			req.setAttribute("lista_resposta", lstTurmas );
			rd.forward(req, res);
			bd.close();
			
		} catch (ConexaoException e) {
			mensagemErro(req, res, "Erro Pesquisa", e.getMessage() );
			return false;
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return true;
	}
	
	private boolean removerTurma(HttpServletRequest req, HttpServletResponse res) {
		TurmaBD bd = new TurmaBD();
		
		String nome = req.getParameter( "remover" );
		
		try {
			bd.delTurma( nome );
			bd.close();
		} catch (TurmaException e) {
			mensagemErro(req, res, "Erro Remover", e.getMessage() );
			return false;
		} catch (ConexaoException e) {
			e.printStackTrace();
		}
		
		mensagemSucesso(req, res, "Sucesso Remover", "Turma removida com sucesso.");
		return true;
	}
	
	private boolean editarTurma(HttpServletRequest req, HttpServletResponse res) {
		TurmaBD bd = new TurmaBD();
		
		String nome = req.getParameter( "editar" );
		
		try {
			
			Turma tempTurma = bd.getTurma( nome );
			RequestDispatcher rd = req.getRequestDispatcher( "editar_turma.jsp" );
			req.setAttribute( "turma", tempTurma );
			rd.forward( req, res );
			bd.close();
			
		} catch (TurmaException e) {
			mensagemErro(req, res, "Erro Editar", e.getMessage());
			return false;
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ConexaoException e) {
			e.printStackTrace();
		}
		
		return true;
	}
	
	private boolean atualizarTurma( HttpServletRequest req, HttpServletResponse res ) {
		TurmaBD bd = new TurmaBD();
		CursoBD bdCurso = new CursoBD();
		ProfessorBD bdProfessor = new ProfessorBD();
		
		String nome = req.getParameter( "nome" );
		String matriculaProfessor = req.getParameter( "professor" );
		String codigoCurso = req.getParameter( "curso" );
		String nomeAntigo = req.getParameter( "old" );
		
		try {
			Curso cursoDaTurma = bdCurso.getCursoPorCodigo(codigoCurso);
			Professor professorDaTurma = bdProfessor.getProfessor(matriculaProfessor);
			
			Turma tempTurma = new Turma( nome, cursoDaTurma );
			tempTurma.setProfessor( professorDaTurma );
			
			bd.updateTurma( tempTurma, nomeAntigo );
			bd.close();
			bdCurso.close();
			bdProfessor.close();

		} catch (ConexaoException e) {
			e.printStackTrace();
		} catch (ProfessorException e) {
			e.printStackTrace();
		} 
		mensagemSucesso( req, res, "Sucesso Atualização.", "Turma <b>" + nome + "</b> editada com sucesso.");
		
		return true;
	}
	
	private void mensagemErro( HttpServletRequest req, HttpServletResponse res, String topico, String mensagem ) {
		RequestDispatcher rd = req.getRequestDispatcher("erro.jsp");
		req.setAttribute("topico", topico);
		req.setAttribute("mensagem", mensagem);
		try {
			rd.forward(req, res);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void mensagemSucesso( HttpServletRequest req, HttpServletResponse res, String topico, String mensagem ) {
		RequestDispatcher rd = req.getRequestDispatcher("sucesso.jsp");
		req.setAttribute("topico", topico);
		req.setAttribute("mensagem", mensagem);
		try {
			rd.forward(req, res);
		} catch (ServletException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}